package at.mensch;

import java.util.ArrayList;
import java.util.List;

/**
 * @author Robert
 *
 */
public class Game {

	List<Player> players = new ArrayList<Player>();
	Table gameTable = new Table();
	Dice d = new Dice();
	public List<Integer> diceEyes = new ArrayList<Integer>();
	int activePlayerID = 1;
	
	public Game(){
		
		Player one = new Player();
		Player two = new Player();
		
		one.setPlayerId(1);
		one.setUsername("Super Mario");	
		
		two.setPlayerId(2);
		two.setUsername("Computer");
	
		players.add(one);
		players.add(two);
		
		Pawn pawn1 = new Pawn();
		Pawn pawn2 = new Pawn();
		
		pawn1.setPawnId(1);
		pawn1.setPlayer(one);
		
		pawn2.setPawnId(2);
		pawn2.setPlayer(two);
		
		List<Pawn> onePawns = new ArrayList<Pawn>();
		List<Pawn> twoPawns = new ArrayList<Pawn>();
		
		onePawns.add(pawn1);
		twoPawns.add(pawn2);
		
		one.setPawnList(onePawns);
		two.setPawnList(twoPawns);
	
		one.initHomeFields(gameTable.getHomeFieldsOfPlayer(one), onePawns);
		two.initHomeFields(gameTable.getHomeFieldsOfPlayer(two), twoPawns);
		
		updateFieldTags();
//		updateHomeFieldTags();
		updateFinishFieldTags();
		//startTurn();
	}
	
	public Player getActivePlayer(){
		Player activePlayer = new Player();
		for(Player p : players){
			if(p.getPlayerId() == activePlayerID){
				activePlayer = p;
			}
		}
		return activePlayer;
	}
	
	public List<Field> getFields(){
		return gameTable.getFieldList();
	}
	
	public List<FinishField> getFinishFields(){
		return gameTable.getFinishFields();
	}
	
	public List<HomeField> getHomeFields(){
		return gameTable.getHomeFields();
	}
	
	public List<Player> getPlayerList(){
		return this.players;
	}
	
	public void rollDice(){
		int eyes = d.rollDice();
		diceEyes.add(eyes);
		if (eyes != 6) {
			activePlayerID++;
			if (activePlayerID > players.size()) {
				activePlayerID = 1;
			}
		}
	}
	
	public List<Integer> getDiceEyes() {
		return diceEyes;
	}

	public void startTurn(){
		
		if(!diceEyes.isEmpty()){
			if (diceEyes.get(diceEyes.size()-1) != 6 ) {
				diceEyes.clear();
			}
		}
		
		rollDice();
		int dice = diceEyes.get(diceEyes.size()-1);
		
		
		Pawn activePawn = getActivePlayer().getPawnList().get(0); // Da es im Moment nur einen Pawn gibt, kann man ruhigen gewissens immer die Stelle 0 nehmen
		Field currentField = gameTable.getCurrentFieldOfPawn(activePawn);
		Field newField = gameTable.getNewFieldForPawn(activePawn, dice);
		
		if(gameTable.checkHomeFieldForPawn(activePawn)){
			gameTable.putPawnIntoGame(activePawn);
			System.out.println("Groesse Der Hashmap von Spieler" + activePawn.getPlayer().getPlayerId()+": "+activePawn.getPlayer().getHeim().size());
		}
		
		
/*		if(!gameTable.checkFieldForPawnOfPlayer(getActivePlayer())){ // zuerst wird geschaut ob es schon figuren von dem spieler im feld gibt, in diesem  zustand kann er nur auf 6er reagieren
			if(dice == 6){
				if(gameTable.checkHomeFieldForPawn(activePawn)){ // wenn die Figur noch im Starthaus steht
					gameTable.putPawnIntoGame(activePawn); // dann wird sie ans erste feld gesetzt und die alte rausgehaut (inkl. entfernen aus der hashmap)
				}else{ // wenn das Homefield leer ist
					newField = gameTable.getNewFieldForPawn(activePawn, dice); // holt sich das neue Feld fuer den Bauern
					if(gameTable.checkFieldForOccupant(newField)){ // das neue Feld wird auf Feinde gecheckt 
	 					Pawn enemyPawn = gameTable.getPawnOnField(newField); // der Feind wird geholt
	 					gameTable.setPawnToHomeField(enemyPawn); // der feind wird an den Start gebracht
	 					gameTable.removePawnFromOldField(newField); // das Feld auf dem der Feind war wird aus der hashmap entfernt
	 					gameTable.putPawnOnNewField(activePawn, newField); // die eigene Figur wird auf das Feld gesetzt
						
					}else{
						gameTable.putPawnOnNewField(activePawn, newField); // wenn das naechste Feld frei ist, kann die Figur gleich ziehen
						gameTable.getCurrentFieldOfPawn(activePawn); // und die aktuelle Position wird aus der Hashmap entfernt
					}
				}
			}
		}
		else{ // wenn er schon figuren im feld hat, kann er auch auf andere zahlen, ausser 6 reagieren
			if(dice == 6){
				if(gameTable.checkHomeFieldForPawn(activePawn)){ // wenn die Figur noch im Starthaus steht
					gameTable.putPawnIntoGame(activePawn); // dann wird sie ans erste feld gesetzt und die alte rausgehaut (inkl. entfernen aus der hashmap)
				}else{ // wenn das Homefield leer ist
					newField = gameTable.getNewFieldForPawn(activePawn, dice); // holt sich das neue Feld fuer den Bauern
					if(gameTable.checkFieldForOccupant(newField)){ // das neue Feld wird auf Feinde gecheckt 
	 					Pawn enemyPawn = gameTable.getPawnOnField(newField); // der Feind wird geholt
	 					gameTable.setPawnToHomeField(enemyPawn); // der feind wird an den Start gebracht
	 					gameTable.removePawnFromOldField(newField); // das Feld auf dem der Feind war wird aus der hashmap entfernt
	 					gameTable.putPawnOnNewField(activePawn, newField); // die eigene Figur wird auf das Feld gesetzt
						
					}else{
						gameTable.putPawnOnNewField(activePawn, newField); // wenn das naechste Feld frei ist, kann die Figur gleich ziehen
						gameTable.getCurrentFieldOfPawn(activePawn); // und die aktuelle Position wird aus der Hashmap entfernt
					}
				}
			}else{ // wenn die wuerfel also nicht 6 sind kann er sich ganz normal bewegen
				newField = gameTable.getNewFieldForPawn(activePawn, dice); // holt sich das neue Feld fuer den Bauern
				if(gameTable.checkFieldForOccupant(newField)){ // das neue Feld wird auf Feinde gecheckt 
						Pawn enemyPawn = gameTable.getPawnOnField(newField); // der Feind wird geholt
						gameTable.setPawnToHomeField(enemyPawn); // der feind wird an den Start gebracht
						gameTable.removePawnFromOldField(newField); // das Feld auf dem der Feind war wird aus der hashmap entfernt
						gameTable.putPawnOnNewField(activePawn, newField); // die eigene Figur wird auf das Feld gesetzt
					
				}else{
					gameTable.putPawnOnNewField(activePawn, newField); // wenn das naechste Feld frei ist, kann die Figur gleich ziehen
					gameTable.getCurrentFieldOfPawn(activePawn); // und die aktuelle Position wird aus der Hashmap entfernt
				}
			}
		} */
	/* Die untenstehenden drei Methoden muessen nach JEDEM spielzug aufgerufen werden,
	 * um die Tags der einzelnen Felder zu aktualisieren
	 */
			updateFieldTags();
			updateHomeFieldTags();
			updateFinishFieldTags();
	}
	
	/**
	 * Aktualisiert die img, alt und title Tags von den Spielfeldern
	 * Diese Methode ist unbedingt nach jedem Zug auszufuehren!
	 */
	public void updateFieldTags(){
		gameTable.updateFieldTags();
	}

	/**
	 * Aktualisiert die img, alt und title Tags von den Zielfeldern
	 * Diese Methode ist unbedingt nach jedem Zug auszufuehren!
	 */
	public void updateFinishFieldTags(){
		gameTable.updateFinishFieldTags(players);
	}
	
	/**
	 * Aktualisiert die img, alt und title Tags von den Heimfeldern
	 * Diese Methode ist unbedingt nach jedem Zug auszufuehren!
	 */
	public void updateHomeFieldTags(){
		gameTable.updateHomeFieldTags(players);
	}
}
